package cn.biplam.common.client;

import java.io.Serializable;
import java.util.ArrayList;

import cn.biplam.common.wrapper.D2KArray;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;
import cn.biplam.common.wrapper.Result;
import cn.biplam.common.wrapper.sqlresult.SqlResult;

/**
 * 数据操作结果类，用于Operator服务返回数据操作结果<BR>
 * 支持多种结果类型:<BR>
	Boolean,	布尔型<BR>
	String,		字符串型<BR>
	SqlResult,	查询结果型(可以通过setD2ArrayResult自定义查询结果集)<BR>
	SqlArray,	Sql数组类型<BR>
	Dml,		数据操作(返回Dml操作是否成功的布尔值)<BR>
	D2Table,	二位数组类型<BR>
	KvMap,		键值对类型<BR>
	ArrayList;	字符串数组类型<BR>
 */
public class OperatorResult implements Serializable{
	
	private enum Result_Type{
		Boolean,
		String,
		SqlResult,
		SqlArray,
		Dml,
		D2Table,
		KvMap,
		ArrayList;
	}
	private Result_Type type;
	private static final long serialVersionUID = 1L;
	/** 数据操作的二维数组结果，不含列索引 */
	private String[][] d2TableResult;
	/** 可迭代访问的结果集(二维结果集) */
	private Result result;
	/** 数据操作键值对结果 */
	private KvMap<String, String> kvResult;
	/** dml操作结果 */
	private boolean dmlResult=false;
	/** 最后一次操作记录ID */
	private String lastRowId;
	/** 查询记录主键字段 */
	private String mainKey;
	/** 数据操作的字符结果 */
	private String strResult;
	/** 列表结果集 */
	private ArrayList<String> listResult;
	
	/** 当前访问的结果行,用于访问结果集的迭代 */
	private int iCurrentRow=-1;
	/** 结果集记录数目 */
	private int iRecordNumb;
	/** 分页处理对象*/
	private Paging mPageing;
	/** 对象*/
	private Object parser;
	/** sql*/
	private ArrayList<String> sqls;
	
	/** 数据操作返回说明信息 */
	private String operatorInfo;
	
	/** 布尔值结果 */
	private boolean booleanReult;

	/**
	 * 创建数据操作结果
	 */
	public OperatorResult(){
		this(null);
	}
	
	/**
	 * 创建数据操作结果
	 * @param result 结果集
	 */
	public OperatorResult(Result result){
		if(result == null){
			this.iRecordNumb=0;
		}else{
			this.setResult(result);
		}
	}
	
	/**
	 * 将当前结果指针向前移动一位
	 * @return 如果存在下一条记录返回true,如果不存在下一条记录返回false
	 * @throws ErrorMessage 
	 */
	public boolean next() throws ErrorMessage{
		return (this.result==null)?false:this.result.next();
	}
	
	/**
	 * 获取当前结果行的指定列
	 * @param sColName 列名
	 * @return 列数据的字符表示
	 * @throws ErrorMessage 
	 */
	public String getValue(String sColName) throws ErrorMessage{
		if(this.result != null){
			return this.result.getString(sColName);
		}else if(kvResult!=null){
			return kvResult.getByKey(sColName);
		}else{
			return null;
		}
	}
	
	/**
	 * 获取当前结果行的指定列
	 * @param sColName 列名
	 * @return 列数据的字符表示
	 * @throws ErrorMessage 
	 */
	public String getValue(Object sColName) throws ErrorMessage{
		return this.getValue(String.valueOf(sColName));
	}
	
	/**
	 * 获取当前结果指定列的布尔值 0:返回false 1:返回true 其他：返回false
	 * @param sColName 列名
	 * @return boolean
	 * @throws ErrorMessage
	 */
	public boolean getBooleanValue(Object sColName) throws ErrorMessage{
		return this.getBooleanValue(String.valueOf(sColName));
	}
	
	/**
	 * 获取当前结果的指定列的布尔值结果 0:返回false 1:返回true 其他：返回false
	 * @param sColName 列名
	 * @return 列数据的字符表示
	 * @throws ErrorMessage 
	 */
	public boolean getBooleanValue(String sColName) throws ErrorMessage{
		return this.result.getBoolean(sColName);
	}
	
	/**
	 * 获取布尔类型的结果值
	 * @return 布尔值结果
	 * @throws ErrorMessage 如果DML操作结果为FALSE抛出异常
	 */
	public boolean getBooleanValue() throws ErrorMessage{
		if(!Result_Type.Boolean.equals(this.type)){
			throw new ErrorMessage("OperatorResult type error("+this.type+")");
		}
		return this.booleanReult;
	}
	
	/**
	 * 获取当前结果的指定列
	 * @param iColIndex 列下标
	 * @return 列数据的字符表示形式
	 * @throws ErrorMessage 
	 */
	public String getValue(int iColIndex) throws ErrorMessage{
		if(result!=null){
			return result.getString(iColIndex);
		}else if(d2TableResult!=null){
			return d2TableResult[iCurrentRow][iColIndex];
		}else{
			return null;
		}
	}
	
	/**
	 * 获取字符结果 
	 * @return 字符结果
	 */
	public String getValue() {
		return strResult;
	}
	
	/**
	 * @return 返回DML操作结果
	 */
	public boolean dmlSuccess() {
		return dmlResult;
	}
	
	/**
	 *  设置布尔结果
	 */
	public void setBooleanResult(boolean result){
		this.type=Result_Type.Boolean;
		this.booleanReult = result;
	}
	
	/**
	 * 设置结果为DML操作结果 
	 * @param dmlResult
	 */
	public void setDmlResult(boolean dmlResult) {
		this.type=Result_Type.Dml;
		this.dmlResult = dmlResult;
	}
	
	/**
	 * 获取dml操作的主键ID
	 * @return dml操作的主键ID
	 */
	public String getLastRowId() {
		return lastRowId;
	}
	
	/**
	 *  获取DML操作的主键ID
	 * @param lastRowId DML操作的主键ID 
	 */
	public void setLastRowId(String lastRowId) {
		this.lastRowId = lastRowId;
	}
	
	/**
	 * 获取结果集主键ID
	 * @return 结果集主键ID
	 */
	public String getMainKey() {
		return mainKey;
	}
	
	/**
	 * 设置结果集主键ID
	 * @param mainKey 结果集主键ID
	 */
	public void setMainKey(String mainKey) {
		this.mainKey = mainKey;
	}

	/**
	 * 设置结果集为sql查询结果集
	 * @param selectResult 查询结果集
	 */
	public void setSelectResult(SqlResult selectResult) {
		this.type=Result_Type.SqlResult;
		this.setResult(selectResult);
	}
	
	/**
	 * @return 查询结果集
	 */
	public SqlResult getSelectResult() throws ErrorMessage {
		Result rs = this.getResult();
		return (rs==null?null:(SqlResult)rs);
	}
	
	/**
	 * 使用含索引2维表数组初始化SqlResult结果集(自定义SqlResult)
	 * @param arrayResult 含索引2维表数组结果集
	 */
	public void setD2ArrayResult(D2KArray<String> arrayResult) {
		this.setResult(arrayResult);
	}

	/**
	 * 设置可迭代访问的二维结果集(SqlResult或者D2Array)
	 * @param result 二维结果集
	 */
	private void setResult(Result result) {
		if(result==null)return;
		this.type=Result_Type.SqlResult;
		this.result = result;
		this.iCurrentRow=0;
		this.iRecordNumb=result.size();
		this.result.next();
	}
	
	/**
	 * 获取SqlResult结果集
	 * @return  Result
	 * @throws ErrorMessage 
	 */
	public Result getResult() throws ErrorMessage{
		if(!Result_Type.SqlResult.equals(this.type)){
			throw new ErrorMessage("OperatorResult type error("+this.type+")");
		}
		if(this.result!=null){
			this.result.beforeFirst();
		}
		return this.result;
	}
	
	/**
	 * 设置字符结果
	 * @param strResult
	 */
	public void setStrResult(String strResult) {
		this.type=Result_Type.String;
		this.strResult = strResult;
	}

	/**
	 * 获取二维数组结果集
	 * @return	String[][] 
	 * @throws ErrorMessage 
	 */
	public String[][] getD2TableResult() throws ErrorMessage {
		if(!Result_Type.D2Table.equals(this.type)){
			throw new ErrorMessage("OperatorResult type error("+this.type+")");
		}
		return d2TableResult;
	}

	/**
	 * 设置二维数组结果集 
	 * @param tableResult
	 */
	public void setD2TableResult(String[][] tableResult) {
		this.type=Result_Type.D2Table;
		d2TableResult = tableResult;
		this.iCurrentRow=0;
		this.iRecordNumb=tableResult.length;
	}

	/**
	 * 获取键值对结果集
	 * @return KvMap(String,String)
	 * @throws ErrorMessage 
	 */
	public KvMap<String, String> getKvResult() throws ErrorMessage {
		if(!Result_Type.KvMap.equals(this.type)){
			throw new ErrorMessage("OperatorResult type error("+this.type+")");
		}
		return kvResult;
	}

	/**
	 * 返回SqlResult结果集是否为空 
	 * @return boolean
	 */
	public boolean isNull(){
		return this.iRecordNumb==0;
	}
	
	/**
	 * 返回SqlResult结果集记录数
	 * @return int
	 */
	public int size(){
		return this.iRecordNumb;
	}
	
	/**
	 * 设置键值对结果集
	 */
	public void setKvResult(KvMap<String, String> kvResult) {
		this.type=Result_Type.KvMap;
		this.kvResult = kvResult;
	}
	
	/**
	 * 取分页信息
	 */
	public Paging getPaging(){
		return this.mPageing;
	}
	
	/**
	 * 设置分页信息(包含总页数、总行数、是否有上一页、是否有下一页)
	 * @param selectResult
	 * @param pageNum
	 * @throws ErrorMessage 
	 */
	public void setPaging(SqlResult selectResult,String showPageLine,String userId,String optId) throws ErrorMessage{
		this.mPageing = new Paging(showPageLine);
		this.mPageing.set(selectResult,userId,optId);
	}
	
	public Object getParser() {
		return parser;
	}
	
	public void setParser(Object parser) {
		this.parser = parser;
	}

	/**
	 * 取sql
	 * @return ArrayList(String)
	 */
	public ArrayList<String> getSqls() throws ErrorMessage {
		if(!Result_Type.SqlArray.equals(this.type)){
			throw new ErrorMessage("OperatorResult type error("+this.type+")");
		}
		return sqls;
	}

	/**
	 * 设置查询SQL结果
	 * @param sqls 查询SQL
	 */
	public void setSqls(ArrayList<String> sqls) {
		this.type=Result_Type.SqlArray;
		this.sqls = sqls;
	}
	
	/**
	 * 设置数据操作结果说明信息
	 * @param operatorInfo 结果说明
	 */
	public void setOperatorInfo(String operatorInfo){
		this.operatorInfo = operatorInfo;
	}
	
	/**
	 * @return 数据操作结果说明信息,包括异常信息
	 */
	public String getOperatorInfo(){
		return this.operatorInfo;
	}
	
	/**
	 * 设置ArrayList结果
	 */
	public void setListResult(ArrayList<String> listResult){
		this.type=Result_Type.ArrayList;
		this.listResult = listResult;
	}
	
	/**
	 * 返回ArrayList结果
	 * @return 获取列表结果集
	 * @throws ErrorMessage 
	 */
	public ArrayList<String> getListResult() throws ErrorMessage{
		if(!Result_Type.ArrayList.equals(this.type)){
			throw new ErrorMessage("OperatorResult type error("+this.type+")");
		}
		return this.listResult;
	}
}
